﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿﻿using jiuyuan.数据.共享类;
using jiuyuan.服务;
using jiuyuan.管理器;
using System.Text.Json;

namespace jiuyuan.数据.基础数据类;

public abstract class 游戏实体
{
    public Guid Id { get; set; } = Guid.CreateVersion7();
    public string 名称 { get; set; } = string.Empty;
    public string 描述 { get; set; } = string.Empty;
    public string 图标 { get; set; } = string.Empty;
    public DateTime 创建时间 { get; set; } = DateTime.Now; 
    public DateTime 更新时间 { get; set; } = DateTime.Now; 
}

// 属性配置类
public class 属性配置
{
    public int 生命值 { get; set; }
    public int 魔法值 { get; set; }
    public int 物理攻击 { get; set; }
    public int 物理防御 { get; set; }
    public int 火属性攻击 { get; set; }
    public int 水属性攻击 { get; set; }
    public int 风属性攻击 { get; set; }
    public int 土属性攻击 { get; set; }
    public int 火属性抗性 { get; set; }
    public int 水属性抗性 { get; set; }
    public int 风属性抗性 { get; set; }
    public int 土属性抗性 { get; set; }
    public int 速度 { get; set; }
    public int 幸运值 { get; set; }

    /// <summary>
    /// 深拷贝属性配置
    /// </summary>
    public 属性配置 深拷贝()
    {
        return new 属性配置
        {
            生命值 = 生命值,
            魔法值 = 魔法值,
            物理攻击 = 物理攻击,
            物理防御 = 物理防御,
            火属性攻击 = 火属性攻击,
            水属性攻击 = 水属性攻击,
            风属性攻击 = 风属性攻击,
            土属性攻击 = 土属性攻击,
            火属性抗性 = 火属性抗性,
            水属性抗性 = 水属性抗性,
            风属性抗性 = 风属性抗性,
            土属性抗性 = 土属性抗性,
            速度 = 速度,
            幸运值 = 幸运值
        };
    }

    /// <summary>
    /// 合并两个属性配置
    /// </summary>
    public static 属性配置 合并属性(属性配置 基础属性, 属性配置 加成属性)
    {
        return new 属性配置
        {
            生命值 = 基础属性.生命值 + 加成属性.生命值,
            魔法值 = 基础属性.魔法值 + 加成属性.魔法值,
            物理攻击 = 基础属性.物理攻击 + 加成属性.物理攻击,
            物理防御 = 基础属性.物理防御 + 加成属性.物理防御,
            火属性攻击 = 基础属性.火属性攻击 + 加成属性.火属性攻击,
            水属性攻击 = 基础属性.水属性攻击 + 加成属性.水属性攻击,
            风属性攻击 = 基础属性.风属性攻击 + 加成属性.风属性攻击,
            土属性攻击 = 基础属性.土属性攻击 + 加成属性.土属性攻击,
            火属性抗性 = 基础属性.火属性抗性 + 加成属性.火属性抗性,
            水属性抗性 = 基础属性.水属性抗性 + 加成属性.水属性抗性,
            风属性抗性 = 基础属性.风属性抗性 + 加成属性.风属性抗性,
            土属性抗性 = 基础属性.土属性抗性 + 加成属性.土属性抗性,
            速度 = 基础属性.速度 + 加成属性.速度,
            幸运值 = 基础属性.幸运值 + 加成属性.幸运值
        };
    }
}

// 统一的游戏元素基类
public class 游戏元素 : 游戏实体
{
    public 物品类型 类型 { get; set; }
    public int 等级要求 { get; set; }
    public int 数量 { get; set; } = 1;
    public 属性配置 基础属性 { get; set; } = new 属性配置();

    // 统一的效果系统
    public ICollection<Guid> 效果ID列表 { get; set; } = [];
    public ICollection<技能效果> 效果列表 { get; set; } = [];

    // 使用配置
    public bool 可装备 { get; set; }
    public bool 可使用 { get; set; }
    public 装备槽位? 装备槽位 { get; set; }
    public int 最大堆叠数 { get; set; } = 99;
    public int 冷却时间 { get; set; }
    public int 消耗魔法值 { get; set; }
    public 技能目标类型 目标类型 { get; set; }
    public 元素属性类型 元素类型 { get; set; }
    
    /// <summary>
    /// 深拷贝游戏元素
    /// </summary>
    public 游戏元素 深拷贝()
    {
        return new 游戏元素
        {
            Id = Id,
            名称 = 名称,
            描述 = 描述,
            图标 = 图标,
            创建时间 = 创建时间,
            更新时间 = 更新时间,
            类型 = 类型,
            等级要求 = 等级要求,
            数量 = 数量,
            基础属性 = 基础属性?.深拷贝() ?? new 属性配置(),
            效果ID列表 = new List<Guid>(效果ID列表),
            效果列表 = 效果列表.Select(e => e.深拷贝()).ToList(),
            可装备 = 可装备,
            可使用 = 可使用,
            装备槽位 = 装备槽位,
            最大堆叠数 = 最大堆叠数,
            冷却时间 = 冷却时间,
            消耗魔法值 = 消耗魔法值,
            目标类型 = 目标类型,
            元素类型 = 元素类型
        };
    }
}

// 物品基类
public abstract class 物品 : 游戏实体
{
    public 物品类型 类型 { get; set; }
    public int 等级要求 { get; set; }
    public int 数量 { get; set; } = 1; // 添加数量属性，默认为1
    public 属性配置 基础属性 { get; set; } = new 属性配置();
}

// 技能配置类
public class 技能配置 : 物品
{
    public 技能目标类型 目标类型 { get; set; }
    public 技能效果类型 效果类型 { get; set; }
    public 元素属性类型 元素类型 { get; set; }
    public int 消耗魔法值 { get; set; }
    public int 冷却时间 { get; set; }

    // 存储效果ID列表，从数据库关联获取具体效果
    public ICollection<Guid> 效果ID列表 { get; set; } = [];

    // 导航属性 - 具体的效果实例（在加载时填充）
    public ICollection<技能效果> 效果列表 { get; set; } = [];
}

// 战斗单位基类
public abstract class 战斗单位 : 游戏实体
{
    public string 头像 { get; set; } = string.Empty;
    public 战斗单位类型 单位类型 { get; set; }
    public 属性配置 基础属性 { get; set; } = new 属性配置();
    public 属性配置 当前属性 { get; set; } = new 属性配置();
    public int 当前生命值 { get; set; }
    public int 当前魔法值 { get; set; }
    public bool 是否存活 => 当前生命值 > 0;
    public List<技能配置> 技能列表 { get; set; } = [];
    public List<持续效果> 持续效果列表 { get; set; } = [];

    public void 重新计算属性()
    {
        // 先重置为基础属性
        当前属性 = 基础属性.深拷贝();

        // 应用所有持续效果
        foreach (var 持续效果 in 持续效果列表)
        {
            if (持续效果.基础效果 is jiuyuan.管理器.动态速度减益效果 速度减益)
            {
                // 速度减益效果已经在持续效果类中处理
            }
            else if (持续效果.基础效果 is jiuyuan.管理器.动态属性增益效果 属性增益)
            {
                // 属性增益效果已经在持续效果类中处理
            }
        }

        // 确保属性不为负
        当前属性.速度 = Math.Max(0, 当前属性.速度);
        当前属性.物理攻击 = Math.Max(0, 当前属性.物理攻击);
        当前属性.物理防御 = Math.Max(0, 当前属性.物理防御);
    }
}